package com.demo.algorithm.demo4;

import java.util.concurrent.CountDownLatch;

/**
 * <p>
 * </p>
 *
 * @author yanyg
 * @date 2024/2/16 15:45
 */
public class T02_sync_wait_notify {

    public static void main(String[] args) {
        CountDownLatch latch = new CountDownLatch(1);
        final Object object = new Object();

        char[] aI = "1234567".toCharArray();
        char[] aC = "ABCDEFG".toCharArray();

        new Thread(()->{

            try {
                latch.await();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }

            // 对应object有一个要持有object锁的等待队列（线程队列）

            synchronized (object){
                for (char c : aI){
                    System.out.print(c);
                    // 唤醒在该对象上等待的某个线程
                    object.notify();
                    // 让当前线程进入等待状态。直到其他线程调用此对象的 notify() 方法或 notifyAll() 方法。
                    try {
                        object.wait();
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }

                object.notify(); // 必须加，否则无法终止程序（最后剩一个线程在 wait）
            }

        },"t1").start();

        new Thread(()->{
            synchronized (object){
                for (char c : aC){
                    System.out.print(c);
                    latch.countDown();
                    // 唤醒在该对象上等待的某个线程
                    object.notify();
                    // 让当前线程进入等待状态。直到其他线程调用此对象的 notify() 方法或 notifyAll() 方法。
                    try {
                        object.wait();
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }

                object.notify();
            }

        },"t2").start();
    }
}
